home *** CD-ROM | disk | FTP | other *** search
- 10 ' 123RANGE.BAS List Lotus Range Names used in a spreadsheet file (.wks)20 '
- 20 ' Charles H. Greene dba ISM April 23, 1983
- 30 ' 150 West First Street Rev.1 May 20, 1983
- 40 ' New Richmond, Wi 54017 <715> 246-6690
- 50 '
- 60 ' Lotus v1.0 does not provide for listing Range Names that have been
- 70 ' assigned..this program provides a modest solution to that problem.
- 90 '
- 100 ' Range Name FLD.CNT()
- 110 ' Specification 1...5...10....5...20....5.28
- 120 ' AAAAAAAAAAAAAAABCCDDEEFFGGGG
- 130 ' where
- 140 ' A=range name 00h is used in place of space 20h
- 150 ' B=unknown 00h
- 160 ' C=begining column low/high byte format value is 1 less
- 170 ' D= row than actual value ie.2048=FF07h
- 180 ' E=ending column
- 190 ' F= row
- 200 ' G=seperators 0B 00 18 00h
- 210 '
- 220 '
- 1000 DEFINT A-Z
- 1010 DIM RANGE$(500)
- 1020 RCNT=0: RMAX=500
- 1030 BLACK=0: WHITE=7: BRIGHT=16: FG=WHITE: BG=BLACK
- 1040 FALSE=0: TRUE=NOT FALSE
- 1050 END.OF.FILE=FALSE
- 1060 FF$=CHR$(12)
- 1070 X=0: Y=0: Z=0
- 1080 X$=""
- 1090 'characters seperating range names
- 1100 LOTUS.CTL$(1)=CHR$(11) 'Range Name fields begin with this
- 1110 LOTUS.CTL$(2)=CHR$(0) ' sequence of characters (1)-(4)
- 1120 LOTUS.CTL$(3)=CHR$(24) 'any break in this sequence ends
- 1130 LOTUS.CTL$(4)=CHR$(0) ' the range names
- 5000 '
- 5010 ' Load table of column codes
- 5020 '
- 5030 DIM COL$(256)
- 5040 FOR X = 0 TO 255
- 5050 READ COL$(X)
- 5060 NEXT
- 5070 '
- 5080 ' Print Headings
- 5090 '
- 5100 PRINT
- 5110 KEY OFF: CLS: LOCATE ,,0
- 5120 HEAD1$="List Lotus(tm) Range Names 123RANGE <ISM>": PRINT HEAD1$
- 5130 PRINT
- 5140 '
- 5150 ' Get Lotus filespec
- 5160 '
- 5170 ON ERROR GOTO 15000
- 5180 PRINT "Enter LOTUS spreadsheet filespec : ";
- 5190 INPUT "",FILE$
- 5200 Z=INSTR(FILE$,".") 'make sure it has .wks extension
- 5210 IF Z=0 THEN FILE$=FILE$+".WKS"
- 5220 OPEN FILE$ AS #1 LEN=1
- 5230 FIELD #1,1 AS X$
- 5240 FCB=VARPTR(#1) 'address FCB
- 5250 Z=PEEK(FCB) 'file type must be random
- 5260 IF Z<>4 THEN CLOSE #1: GOTO 5140
- 5270 RCDLIMIT!=((PEEK(FCB+19)*256)*256)+PEEK(FCB+17)+(256*PEEK(FCB+18))
- 5280 IF RCDLIMIT!=0 THEN CLOSE #1: PRINT: PRINT "**** File not found ****": GOTO 5140
- 5290 PRINT: PRINT: PRINT "File contains "RCDLIMIT!"bytes.": PRINT: PRINT
- 5300 HEAD2$="File: "+FILE$+SPACE$(49-LEN(FILE$))+DATE$+" "+LEFT$(TIME$,5)
- 6000 '
- 6010 ' Process
- 6020 '
- 6030 GOSUB 8000 'get byte
- 6040 FLD.CNT=1: RANGE.NAME$=""
- 6050 WHILE NOT END.OF.FILE
- 6060 ON MATCH.CNT+1 GOSUB 10000, 10060, 10100, 10140, 11000
- 6070 GOSUB 8000
- 6080 WEND
- 7000 '
- 7010 ' End of Input
- 7020 '
- 7030 PRINT: PRINT: PRINT "< END OF LIST >"
- 7040 PRINT: PRINT
- 7050 INPUT "Output to Printer (Y/N) ";ANS$
- 7060 IF ANS$="Y" OR ANS$="y" THEN GOSUB 16000
- 7070 END 'done
- 8000 '
- 8010 ' Read file
- 8020 '
- 8030 RCDNO!=RCDNO!+1 'set next random record(byte) no.
- 8040 'check for end of file
- 8050 IF RCDNO!>RCDLIMIT! THEN END.OF.FILE=TRUE: X$="": GOTO 8070
- 8060 GET #1,RCDNO!
- 8070 RETURN
- 10000 '
- 10010 ' Look for start of range names 0Bh 00h 18h 00h
- 10020 '
- 10030 IF X$<>CHR$(11) THEN MATCH.CNT = 0:RETURN
- 10040 MATCH.CNT=1
- 10050 RETURN
- 10060 '
- 10070 IF X$<>CHR$(0) THEN MATCH.CNT = 0: GOTO 10000
- 10080 MATCH.CNT=2
- 10090 RETURN
- 10100 '
- 10110 IF X$<>CHR$(24) THEN MATCH.CNT = 0: GOTO 10000
- 10120 MATCH.CNT=3
- 10130 RETURN
- 10140 '
- 10150 IF X$<>CHR$(0) THEN MATCH.CNT = 0: GOTO 10000
- 10160 MATCH.CNT=4
- 10170 RETURN
- 11000 '
- 11010 ' Range name fields found
- 11020 '
- 11030 IF FLD.CNT > 15 GOTO 11070
- 11040 IF X$<>CHR$(0) THEN RANGE.NAME$=RANGE.NAME$+X$
- 11050 FLD.CNT=FLD.CNT+1
- 11060 RETURN
- 11070 IF FLD.CNT > 18 GOTO 11110
- 11080 IF FLD.CNT = 17 THEN RANGE.BEG.COL=ASC(X$)
- 11090 FLD.CNT=FLD.CNT+1
- 11100 RETURN
- 11110 IF FLD.CNT > 20 GOTO 11170
- 11120 IF FLD.CNT = 19 THEN RANGE.BEG.ROW=ASC(X$): GOTO 11150
- 11130 R=ASC(X$): IF R>8 THEN R=8
- 11140 RANGE.BEG.ROW=RANGE.BEG.ROW+(R*256)
- 11150 FLD.CNT=FLD.CNT+1
- 11160 RETURN
- 11170 IF FLD.CNT > 22 GOTO 11210
- 11180 IF FLD.CNT = 21 THEN RANGE.END.COL=ASC(X$)
- 11190 FLD.CNT=FLD.CNT+1
- 11200 RETURN
- 11210 IF FLD.CNT > 24 GOTO 11400
- 11220 IF FLD.CNT = 23 THEN RANGE.END.ROW=ASC(X$): FLD.CNT=FLD.CNT+1: RETURN
- 11230 ' row must be 1-2048
- 11240 R=ASC(X$): IF R>8 THEN R=8
- 11250 RANGE.END.ROW=RANGE.END.ROW+(R*256)
- 11260 '
- 11270 ' Print range entry
- 11280 '
- 11290 IF RCNT=RMAX THEN PRINT "*** RANGE$ ARRAY EXCEEDED ***": END
- 11300 RCNT=RCNT+1
- 11310 PRINT USING "\ \";RANGE.NAME$;
- 11320 RANGE.BEG$=COL$(RANGE.BEG.COL)+MID$(STR$(RANGE.BEG.ROW+1),2)
- 11330 RANGE.END$=COL$(RANGE.END.COL)+MID$(STR$(RANGE.END.ROW+1),2)
- 11340 PRINT " "RANGE.BEG$".."RANGE.END$" ";
- 11350 IF RANGE.BEG.ROW>2047 OR RANGE.END.ROW>2047 THEN PRINT "*** Out of bounds ***" ELSE PRINT
- 11360 RANGE.NAME$=RANGE.NAME$+SPACE$(17-LEN(RANGE.NAME$))
- 11370 RANGE$(RCNT)=RANGE.NAME$+" "+RANGE.BEG$+".."+RANGE.END$
- 11380 FLD.CNT=FLD.CNT+1: RANGE.NAME$=""
- 11390 RETURN
- 11400 IF X$<>LOTUS.CTL$(FLD.CNT-24) THEN END.OF.FILE=TRUE
- 11410 IF FLD.CNT < 28 THEN FLD.CNT=FLD.CNT+1 ELSE FLD.CNT=1
- 11420 RETURN
- 15000 '
- 15010 ' Error traps
- 15020 '
- 15030 IF ERR=57 THEN PRINT: PRINT "**** I/O Error ****": END
- 15040 IF ERR<24 OR ERR>25 GOTO 15090
- 15050 IF ERL = 5210 THEN 15110
- 15060 IF ERL<>8060 GOTO 15140
- 15070 PRINT:PRINT "**** Check disk drive -- press any key to continue ****"
- 15080 CHAR$=INKEY$: IF CHAR$="" THEN 15070 ELSE RESUME
- 15090 ' Disk file open errors
- 15100 GOTO 15170
- 15110 ' Disk I/O errors
- 15120 IF ERR=62 OR ERR=63 THEN END.OF.FILE=TRUE: X$="": RESUME 8070
- 15130 GOTO 15170
- 15140 '
- 15150 PRINT:PRINT "**** Check printer -- press any key to continue ****"
- 15160 CHAR$=INKEY$: IF CHAR$="" THEN 15160 ELSE RESUME
- 15170 '
- 15180 IF ERR=6 THEN RESUME NEXT
- 15190 PRINT "ERROR #"ERR" IN LINE "ERL
- 15200 ON ERROR GOTO 0
- 16000 '
- 16010 ' List ranges to printer in columns
- 16020 '
- 16030 C1=1: C2=(RCNT+1)/2: RMAX=C2-1: LINE.CNT=99: PAGE.CNT=0
- 16040 IF LINE.CNT>56 THEN GOSUB 16150 ' Page heading
- 16050 LPRINT RANGE$(C1);
- 16060 X=LEN(RANGE$(C1)): LPRINT SPC(40-X);
- 16070 LPRINT RANGE$(C2)
- 16080 LINE.CNT=LINE.CNT+1
- 16090 IF C1<RMAX THEN C1=C1+1: C2=C2+1: GOTO 16040
- 16100 ' Finish report
- 16110 LPRINT:LPRINT
- 16120 LPRINT "< END OF LIST >"
- 16130 LPRINT CHR$(12)
- 16140 RETURN
- 16150 '
- 16160 ' Page overflow
- 16170 '
- 16180 LPRINT CHR$(12) ' top of form
- 16190 LINE.CNT=4: PAGE.CNT=PAGE.CNT+1
- 16200 LPRINT HEAD1$" Page ";
- 16210 LPRINT USING "###";PAGE.CNT
- 16220 LPRINT HEAD2$
- 16230 LPRINT:LPRINT
- 16240 RETURN
- 60000 '
- 60010 ' Col Subscript
- 60020 '
- 60030 DATA A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
- 60040 DATA AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ
- 60050 DATA BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ
- 60060 DATA CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ
- 60070 DATA DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,DS,DT,DU,DV,DW,DX,DY,DZ
- 60080 DATA EA,EB,EC,ED,EE,EF,EG,EH,EI,EJ,EK,EL,EM,EN,EO,EP,EQ,ER,ES,ET,EU,EV,EW,EX,EY,EZ
- 60090 DATA FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM,FN,FO,FP,FQ,FR,FS,FT,FU,FV,FW,FX,FY,FZ
- 60100 DATA GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK,GL,GM,GN,GO,GP,GQ,GR,GS,GT,GU,GV,GW,GX,GY,GZ
- 60110 DATA HA,HB,HC,HD,HE,HF,HG,HH,HI,HJ,HK,HL,HM,HN,HO,HP,HQ,HR,HS,HT,HU,HV,HW,HX,HY,HZ
- 60120 DATA IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL,IM,IN,IO,IP,IQ,IR,IS,IT,IU,IV
- 65399 '** DONE - PRESS ENTER TO RETURN TO MENU **
- 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111